home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / db / RCS / Db_Get.c,v < prev    next >
Text File  |  1989-01-13  |  6KB  |  262 lines

  1. head     1.5;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.5
  10. date     89.01.13.11.44.23;  author douglis;  state Exp;
  11. branches ;
  12. next     1.4;
  13.  
  14. 1.4
  15. date     89.01.02.13.41.51;  author douglis;  state Exp;
  16. branches ;
  17. next     1.3;
  18.  
  19. 1.3
  20. date     88.09.22.22.11.33;  author douglis;  state Exp;
  21. branches ;
  22. next     1.2;
  23.  
  24. 1.2
  25. date     88.09.13.16.48.24;  author douglis;  state Exp;
  26. branches ;
  27. next     1.1;
  28.  
  29. 1.1
  30. date     88.08.14.15.07.50;  author douglis;  state Exp;
  31. branches ;
  32. next     ;
  33.  
  34.  
  35. desc
  36. @Procedure to retrieve a record from a database.
  37. @
  38.  
  39.  
  40. 1.5
  41. log
  42. @changed for buffering and for new arg passing to lock routine.
  43. [generic checkin msg].
  44. @
  45. text
  46. @/* 
  47.  * Db_Get.c --
  48.  *
  49.  *    Source code for the Db_Get procedure.
  50.  *
  51.  * Copyright 1988 Regents of the University of California
  52.  * Permission to use, copy, modify, and distribute this
  53.  * software and its documentation for any purpose and without
  54.  * fee is hereby granted, provided that the above copyright
  55.  * notice appear in all copies.  The University of California
  56.  * makes no representations about the suitability of this
  57.  * software for any purpose.  It is provided "as is" without
  58.  * express or implied warranty.
  59.  */
  60.  
  61. #ifndef lint
  62. static char rcsid[] = "$Header: /sprite/src/lib/c/db/RCS/Db_Get.c,v 1.4 89/01/02 13:41:51 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  63. #endif not lint
  64.  
  65.  
  66. #include <db.h>
  67. #include "dbInt.h"
  68.  
  69.  
  70. /*
  71.  *----------------------------------------------------------------------
  72.  *
  73.  * Db_Get --
  74.  *
  75.  *    Obtain a random entry, or the next entry in order, given the handle
  76.  *    for a database.
  77.  *
  78.  * Results:
  79.  *    -1 indicates an error, in which case errno indicates more details.
  80.  *    0 indicates success.
  81.  *
  82.  * Side effects:
  83.  *    The position in the file is updated.
  84.  *
  85.  *----------------------------------------------------------------------
  86.  */
  87.  
  88. int
  89. Db_Get(handlePtr, bufPtr, index)
  90.     Db_Handle *handlePtr;    /* handle to the database */
  91.     char *bufPtr;        /* place to store record */
  92.     int index;             /* -1 to indicate next in order, else which
  93.                  * record to obtain */
  94. {
  95.     register int streamID;
  96.     int bufSize;
  97.     int offset;
  98.     int bytesRead;
  99.     int status;
  100.     int structSize = handlePtr->structSize;
  101.     char *buffer;
  102.     int doSeek;
  103.     register int firstRec;
  104.  
  105.     if (index == -1) {
  106.     index = handlePtr->index;
  107.     doSeek = 0;
  108.     } else if (index != handlePtr->index) {
  109.     doSeek = 1;
  110.     }
  111.     if (handlePtr->numBuf > 0) {
  112.     firstRec = handlePtr->firstRec;
  113.     if ((firstRec >= 0) && (index >= firstRec) &&
  114.         (index < firstRec + handlePtr->numBuf)) {
  115.         bcopy(handlePtr->buffer + (index - firstRec) *
  116.               structSize,
  117.           bufPtr, structSize);
  118.         handlePtr->index = index + 1;
  119.         return(0);
  120.     }
  121.     buffer = handlePtr->buffer;
  122.     bufSize = handlePtr->numBuf * structSize;
  123.     } else {
  124.     buffer = bufPtr;
  125.     bufSize = structSize;
  126.     }
  127.     
  128.     streamID = handlePtr->streamID;
  129.     if (handlePtr->lockWhen == DB_LOCK_ACCESS || 
  130.     handlePtr->lockWhen == DB_LOCK_READ_MOD_WRITE) {
  131.     status = DbLockDesc(handlePtr);
  132.     if (status == -1) {
  133.         return(status);
  134.     }
  135.     }
  136.     if (doSeek) {
  137.     offset = index * structSize;
  138.     status = lseek(streamID, (long) offset, L_SET);
  139.     if (status == -1) {
  140.         return(status);
  141.     }
  142.     }
  143.     bytesRead = read(streamID, buffer, bufSize);
  144.     if (bytesRead == -1) {
  145.     status = -1;
  146.     } else if (bytesRead == 0) {
  147.     /*
  148.      * end of file.
  149.      */
  150.     status = -1;
  151.     errno = 0;
  152.     } else if (bytesRead % structSize != 0) {
  153. #ifndef CLEAN
  154.     syslog(LOG_ERR, "Db_Get: file %s is not a multiple of %d bytes",
  155.            handlePtr->fileName, structSize);
  156. #endif /* CLEAN */
  157.     status = -1;
  158.     errno = EACCES;
  159.     } else {
  160.     status = 0;
  161.     if (handlePtr->numBuf > 0) {
  162.         handlePtr->firstRec = index;
  163.         handlePtr->numBuf = bytesRead / structSize;
  164.         bcopy(handlePtr->buffer, bufPtr, structSize);
  165.     }
  166.         
  167.     }
  168.     
  169.     handlePtr->index = index + 1;
  170.  
  171.     /*
  172.      * Try to unlock the file if we locked it before (and it's not a
  173.      * read-modify-write) , but ignore any
  174.      * errors from the unlock.  It's possible to get an RPC timeout doing
  175.      * the lock but keep going, then get an error because the lock was
  176.      * never performed.
  177.      */
  178.     if (handlePtr->lockWhen == DB_LOCK_ACCESS) {
  179.     (void) flock(streamID, handlePtr->lockType | LOCK_UN);
  180.     }
  181.     return(status);
  182. }
  183. @
  184.  
  185.  
  186. 1.4
  187. log
  188. @added a lock type DB_LOCK_READ_MOD_WRITE.
  189. @
  190. text
  191. @d17 1
  192. a17 1
  193. static char rcsid[] = "$Header: /sprite/src/lib/c/db/RCS/Db_Get.c,v 1.3 88/09/22 22:11:33 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  194. d55 4
  195. d60 23
  196. a83 1
  197.     bufSize = handlePtr->structSize;
  198. d86 1
  199. a86 2
  200.     status = DbLockDesc(streamID, handlePtr->lockType,
  201.                  handlePtr->lockHow);
  202. d91 2
  203. a92 4
  204.     if (index == -1) {
  205.     index = handlePtr->index;
  206.     } else {
  207.     offset = index * bufSize;
  208. d98 1
  209. a98 1
  210.     bytesRead = read(streamID, bufPtr, bufSize);
  211. d101 4
  212. a104 1
  213.     } else if (bytesRead != bufSize) {
  214. d107 7
  215. d116 6
  216. @
  217.  
  218.  
  219. 1.3
  220. log
  221. @Changed some arg. orders, var. names, and Db_LockDesc to DbLockDesc.
  222. @
  223. text
  224. @d17 1
  225. a17 1
  226. static char rcsid[] = "$Header: Db_Get.c,v 1.2 88/09/13 16:48:24 douglis Exp $ SPRITE (Berkeley)";
  227. d58 2
  228. a59 1
  229.     if (handlePtr->lockWhen == DB_LOCK_ACCESS) {
  230. d88 2
  231. a89 1
  232.      * Try to unlock the file if we locked it before, but ignore any
  233. @
  234.  
  235.  
  236. 1.2
  237. log
  238. @fixed some lint.
  239. @
  240. text
  241. @d17 1
  242. a17 1
  243. static char rcsid[] = "$Header: Db_Get.c,v 1.1 88/08/14 15:07:50 douglis Exp $ SPRITE (Berkeley)";
  244. d59 1
  245. a59 1
  246.     status = Db_LockDesc(streamID, handlePtr->lockType,
  247. @
  248.  
  249.  
  250. 1.1
  251. log
  252. @Initial revision
  253. @
  254. text
  255. @d17 1
  256. a17 1
  257. static char rcsid[] = "$Header: proto.c,v 1.2 88/03/11 08:39:08 ouster Exp $ SPRITE (Berkeley)";
  258. d69 1
  259. a69 1
  260.     status = lseek(streamID, offset, L_SET);
  261. @
  262.